package com.app.util;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import uk.ltd.getahead.dwr.WebContextFactory;
@SuppressWarnings({"unused"})
public class Util {
	
	/**
	 * 数据转换
	 * @param obj
	 * @return
	 */
	public static String getStringOfObject(Object obj){
		if(obj == null){
			return "";
		}else if(obj instanceof Integer){
			return ((Integer)obj).toString();
		}else if(obj instanceof Short){
			return ((Short)obj).toString();
		}else if(obj instanceof Long){
			return ((Long)obj).toString();
		}else if(obj instanceof Float){
			return ((Float)obj).toString();
		}else if(obj instanceof Double){
			return ((Double)obj).toString();
		}else if(obj instanceof Date){
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			return sdf.format(obj);
		}else if(obj instanceof String){
			return (String)obj;
		}else if(obj instanceof BigDecimal){
			return ((BigDecimal)obj).toString();
		}else if(obj instanceof Boolean){
			if((Boolean)obj == true){
				return "true";
			}else{
				return "false";
			}
		}else if(obj instanceof Character){
			return obj.toString();
		}
		return "";
	}
	
    public static HttpSession getHttpSession() {
		HttpSession session = null;
		try {
			session = WebContextFactory.get().getSession();// 从dwr获得session
		} catch (RuntimeException e) {
		}
		if(session==null){
			HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder 
	                 .getRequestAttributes()).getRequest(); 
			session = request.getSession();
		}
		return session;
	}
    
    public static HttpServletResponse getHttpServletResponse() {
    	HttpServletResponse session = null;
		try {
			session = WebContextFactory.get().getHttpServletResponse();// 从dwr获得session
		} catch (RuntimeException e) {
		}
		return session;
	}
    
    public static HttpServletRequest getHttpServletRequest(){
    	HttpServletRequest request = null;
    	try {
			request = WebContextFactory.get().getHttpServletRequest();
		} catch (RuntimeException e) {
			e.printStackTrace();
		}
		return request;
    }
    
    
    /***************
	 * 获得客户端ip地址
	 * @param request
	 * @return
	 */
	public static String getIpAddr(HttpServletRequest request) {
        String ip = request.getHeader("x-forwarded-for");
        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
           ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
           ip = request.getRemoteAddr();
        }
        if(ip.equals("0:0:0:0:0:0:0:1")){
        	ip = "localhost";
        }
       return ip;
   }
	
	
	public static Object[] map2Array(Map map){
		Object[] obj = new Object[map.size()];
		int i = 0;
		for(Object o : map.keySet()){
			obj[i] = map.get(o);
			i++;
		}
		return obj;
	}
	public static String getStrString(List<Map> list,String key){
		StringBuffer str = new StringBuffer();
		for (Map map : list){
			str.append("'"+map.get(key)+"',");
		}
		return str.length() > 0 ? str.deleteCharAt(str.length()-1).toString() : null;
	}
	
	
	//获取树节点的类型
    public static String getNodeType(String treeId){
    	try {
			return treeId.substring(0,1);
		} catch (RuntimeException e) {
			return "";
			
		}
    }
    //获取树节点的类型
    public static String getNodeId(String treeId){
    	try {
			return treeId.substring(1,treeId.length());
		} catch (RuntimeException e) {
			return "";
			
		}
    }
    //处理ext接收的参数或数据库查询的字段数据
    public static String getEmptyMapValue(Map<?,?> map,String key){
    	if(map.get(key)==null){
    		return "";
    	}
    	return map.get(key).toString();
    }
    //处理ext接收的参数或数据库查询的字段数据
    public static String getMapValueZeroIfNull(Map<?,?> map,String key){
    	if(map.get(key)==null){
    		return "0";
    	}
    	return map.get(key).toString();
    }
    //处理空字符串
    public static String getEmptyString(String source,String replaceStr){
    	String returnStr="";
    	if(replaceStr==null){
    		replaceStr="";
    	}
    	if(source==null || "".equals(source)){
    		returnStr = replaceStr;
    	}else{
    		returnStr=source;
    	}
    	return returnStr;
    }
    //某个指标24点平均值
    public static Double getItemAverage(List<String> list){
    	int size=list.size();
    	if(size == 0)
    		return 0d;
    	Double sum=0d;
    	for(String v:list){
    		if("".equals(v) || "0".equals(v)){
    			size--;
    		}else{
    			sum+=Double.parseDouble(v);
    		}
    	}
    	return sum/size;
    }
	
    public static void main(String[] args) throws Exception{
    	List<String> aa = new ArrayList<String>();
    	aa.add("1");aa.add("2");aa.add("3");aa.add("4");aa.add("5");
    	for(int i=0;i<aa.size();i++){
    		System.out.println(aa.get(i));
    		aa.remove(i);
    	}
    }
    /************************************************
     * 

	java.text.NumberFormat 提供了货币值和百分数的格式化输出，比如0.58的百分数输出形式是58%。
	要获得本地的默认格式，可以用下列方法获得.
	
	NumberFormat.getNumberInstance()
	NumberFormat.getCurrencyInstance()
	NumberFormat.getOPercentInstance()
	
	而要获得某个国家或地区的具体格式，可以使用参数Local.XXX,如Locale.GERMANY，Locale.UK。
	
	NumberFormat formatter = NumberFormat.getNumberInstance(Locale.GERMANY);
	
	范例
	
	import java.text.NumberFormat;
	import java.util.Locale;
	
	public class FormatTest {
	
	public static void main(String args[]) {
	
	// 不使用格式化输出数
	double d = 10000.0 / 3.0;
	System.out.println("无格式化输出：" + d);
	
	// 使用本地默认格式输出数
	NumberFormat numberFormat = NumberFormat.getNumberInstance();
	//numberFormat.setMaximumFractionDigits(4);
	//numberFormat.setMinimumIntegerDigits(6);
	String numberString = numberFormat.format(d);
	System.out.println("本地默认格式输出数：" + numberString);
	
	// 使用本地默认格式输出货币值
	NumberFormat currencyFormat = NumberFormat.getCurrencyInstance();
	System.out.println("本地默认格式输出货币值：" + currencyFormat.format(d));
	
	// 使用本地默认格式输出百分数
	NumberFormat percentFormat = NumberFormat.getPercentInstance();
	System.out.println("本地默认格式输出百分数：" + percentFormat.format(d));
	
	// 在不同的国家和地区数字表示的格式也有区别。如德国
	// 使用德国的格式化输出数
	NumberFormat numberFormatG = NumberFormat
	.getNumberInstance(Locale.GERMANY);
	System.out.println("德国数字输出形式：" + numberFormatG.format(d));
	
	// 使用德国货币输出形式
	NumberFormat currencyFormatG = NumberFormat
	.getCurrencyInstance(Locale.GERMANY);
	System.out.println("德国货币输出形式：" + currencyFormatG.format(d));
	
	// 使用美国货币输出形式
	NumberFormat currencyFormatA = NumberFormat
	.getCurrencyInstance(Locale.US);
	System.out.println("美国货币输出形式：" + currencyFormatA.format(d));
	
	// 使用德国百分数输出形式
	NumberFormat percentFormatG = NumberFormat
	.getPercentInstance(Locale.GERMANY);
	System.out.println("德国百分数输出形式：" + percentFormatG.format(d));
	
	System.exit(0);
	}
	}
	
	程序输出
	
	<!--[if !vml]--><!--[endif]-->
	
	由于欧元符号无法在此Console输出，所以显示？
	
	可以指定显示的最多（或最少）整数位和小数位。如
	
	double d = 10000.0 / 3.0;
	NumberFormat numberFormat = NumberFormat.getNumberInstance();
	numberFormat.setMaximumFractionDigits(4);
	numberFormat.setMinimumIntegerDigits(6);
	String numberString = numberFormat.format(d);
	System.out.println(numberString);
	
	输出：
	003,333.3333。整数位不够的补零，小数截去部分四舍五入。
	
	也可以利用NumberFormat的一个子类DecimalFormat来指定输出格式。
	
	
	DecimalFormat decimalFormat = new DecimalFormat("######.0000");
	String s = decimalFormat.format(d);
	和前面一样，显示六个整数位和4个小数位。
	下面对格式化的数字进行解析。
	
	import java.util.Locale;
	import java.text.NumberFormat;
	import java.text.ParseException;
	
	public class ParseFormat {
	
	public static void main(String args[]) {
	
	// 本地格式的解析
	NumberFormat numberFormat1 = NumberFormat.getNumberInstance();
	Number numb1 = null;
	try {
	numb1 = numberFormat1.parse("33,333.33");
	} catch (ParseException e1) {
	System.err.println(e1);
	}
	System.out.println(numb1);
	
	
	// 以德国格式解析
	NumberFormat numberFormat2 = NumberFormat
	.getNumberInstance(Locale.GERMAN);
	Number numb2 = null;
	try {
	numb2 = numberFormat2.parse("33,333.33");
	} catch (ParseException e2) {
	System.err.println(e2);
	}
	System.out.println(numb2);
	
	System.exit(0);
	}
	}
	
	
	程序输出：
	33333.33
	33.333
	
	===========================保留两个小数位===================================
	
	如下，保留两个小数位   
    double     f     =     34.232323;   
    BigDecimal     b     =    new     BigDecimal(f);   
    double     f1     =     b.setScale(2,     BigDecimal.ROUND_HALF_UP).doubleValue();   
    
    //     b.setScale(2,     BigDecimal.ROUND_HALF_UP)     表明四舍五入，保留两位小数   
    上面是对double类型的处理，如果对float的，则将上面所有的double字段换成float就行
	
	
	doublepi=3.1415927;　//圆周率
　　　　//取一位整数
　　　　System.out.println(newDecimalFormat("0").format(pi));　　　//3
　　　　//取一位整数和两位小数
　　　　System.out.println(newDecimalFormat("0.00").format(pi));　//3.14
　　　　//取两位整数和三位小数，整数不足部分以0填补。
　　　　System.out.println(newDecimalFormat("00.000").format(pi));// 03.142
　　　　//取所有整数部分
　　　　System.out.println(newDecimalFormat("#").format(pi));　　　//3
　　　　//以百分比方式计数，并取两位小数
　　　　System.out.println(newDecimalFormat("#.##%").format(pi));　//314.16%
　　
　　　　longc=299792458;　　//光速
　　　　//显示为科学计数法，并取五位小数
　　　　System.out.println(newDecimalFormat("#.#####E0").format(c));　//2.99792E8
　　　　//显示为两位整数的科学计数法，并取四位小数
　　　　System.out.println(newDecimalFormat("00.####E0").format(c));　//29.9792E7
　　　　//每三位以逗号进行分隔。
　　　　System.out.println(newDecimalFormat(",###").format(c));　　　//299,792,458
　　　　//将格式嵌入文本
　　　　System.out.println(newDecimalFormat("光速大小为每秒,###米。").format(c));

     * 
     */
}
